#pragma once
#include <iostream>
#include <memory>
#include <spdlog/spdlog.h>
#include <spdlog/async.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>


// mode - 运行模式

std::shared_ptr<spdlog::logger> g_logger;
// 初始化日志器
void init_logger(bool mode, const std::string& file, int32_t level)
{
    // 调试模式
    if(mode == false)
    {
        g_logger = spdlog::stdout_color_mt("调试日志器");
        g_logger->flush_on(spdlog::level::level_enum::trace);
        g_logger->set_level(spdlog::level::level_enum::trace);
    }
    // 发布模式
    else
    {
        g_logger = spdlog::basic_logger_mt<spdlog::async_factory>("默认日志器", file);
        g_logger->flush_on((spdlog::level::level_enum)level);
        g_logger->set_level((spdlog::level::level_enum)level);
    }
    g_logger->set_pattern("[%n][%Y-%m-%d %H:%M:%S][%t][%-8l]%v");
}

// 封装支持输出文件名和行号
#define LOG_TRACE(format, ...) g_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) g_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) g_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) g_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) g_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_CRITICAL(format, ...) g_logger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)